#pragma once

#include <iostream>

namespace Alice
{

/*
    结构体字段构造器的模板接口
    这是一个抽象类
    使用此类来实现不同结构体类型字段的多态
*/
template<class StructType>
class DRFieldBase
{
public:
    virtual ~DRFieldBase() = default;
    /*
        打印某个结构体对象对应字段的信息
        这是一个纯虚函数
    */
    virtual void Info(StructType* obj) = 0;
};

/*
    结构体字段构造器
    这是一个模板类
    用来匹配结构体不同类型的字段
*/
template<class StructType, class FieldType>
class DRField : public DRFieldBase<StructType>
{
public:
    DRField(std::string name, FieldType StructType::*field_ptr)
        : m_name(name), m_field_ptr(field_ptr)
    {

    }

    /*
        打印字段的信息
    */
    void Info(StructType* obj) override
    {
        std::cout << "  " << m_name << ": " << obj->*m_field_ptr << std::endl;
    }

private:
    // 字段名
    std::string m_name;
    // 字段指针（字段在结构体内的偏移）
    FieldType StructType::*m_field_ptr;
};

} // namespace Alice
